﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CeA.Reports.Atendimento.DataAccess;
using CeA.Reports.Atendimento.DataAccess.DAO;
using CeA.Reports.Atendimento.DataAccess.Criteria;
using CeA.Reports.Atendimento.DataAccess.DAO.Oracle;

namespace CeA.Reports.Atendimento.Web.WebControls {
    public partial class FiltroHierarquico : System.Web.UI.UserControl {

        #region -- Event Model ------------------------------------------------

        // Event Keys
        private static readonly object PesquisarEventKey = new object();


        // Delegates
        public delegate void PesquisarEventHandler(object sender, PesquisarEventArgs e);


        // Events
        public event PesquisarEventHandler Pesquisar                                {
            add {
                Events.AddHandler(PesquisarEventKey, value);
            }
            remove {
                Events.RemoveHandler(PesquisarEventKey, value);
            }
        }


        // Raiser
        protected virtual void OnPesquisar(PesquisarEventArgs e)                    {
            PesquisarEventHandler handler = Events[PesquisarEventKey] as PesquisarEventHandler;
            if (handler != null) {
                handler(this, e);
            }
        }
        
        
        #endregion


        protected void Page_Init()                                                  {
            lstRFS.SelectedIndexChanged += new EventHandler(lstRFS_SelectedIndexChanged);
            lstRegiao.SelectedIndexChanged += new EventHandler(lstRegiao_SelectedIndexChanged);
            btnPesquisar.Click += new EventHandler(btnPesquisar_Click);
        }


        protected void Page_Load(object sender, EventArgs e)                        {
            if (Page.IsPostBack == false) {
                CarregaAllRfsListBox();
                CarregaAllRegiaoListBox();
                CarregaAllLojaListBox();
                txtHoraInicio.Text = "08:00:00";
                txtHoraFinal.Text = "23:00:00";
                txtTempoEsperaMaior.Text = "01:00:00";
                txtTempoAtendimentoMaior.Text = "01:00:00";
                txtIndiceDesistencia.Text = "40";
                txtDataInicio.Focus();
            }
        }


        protected void lstRFS_SelectedIndexChanged(object sender, EventArgs e)      {
            CarregaAllRegiaoListBox();
            CarregaAllLojaListBox();
        }


        protected void lstRegiao_SelectedIndexChanged(object sender, EventArgs e)   {
            CarregaAllLojaListBox();
        }


        private void btnPesquisar_Click(object sender, EventArgs e)                 {
            TempoAtendimentoFilter filter = new TempoAtendimentoFilter();

            if (lstRFS.SelectedIndex > 0) {
                foreach (ListItem item in lstRFS.Items) {
                    if (item.Selected)
                        filter.addRfs(Convert.ToInt32(item.Value));
                }
            }

            if (lstRegiao.SelectedIndex > 0) {
                foreach (ListItem item in lstRegiao.Items) {
                    if (item.Selected)
                        filter.addRegiao(Convert.ToInt32(item.Value));
                }
            }

            if (lstLoja.SelectedIndex > 0) {
                foreach (ListItem item in lstLoja.Items) {
                    if (item.Selected)
                        filter.addLoja(Convert.ToInt32(item.Value));
                }
            }

            try {
                filter.setDataInicial(txtDataInicio.Text);
                filter.setDataFinal(txtDataFim.Text);
                filter.TempoEsperaMaiorFormatado = txtTempoEsperaMaior.Text;
                filter.TempoAtendimentoMaiorFormatado = txtTempoAtendimentoMaior.Text;

                if (txtHoraInicio.Text.Trim().Length > 0)
                    filter.setHoraInicial(txtHoraInicio.Text);

                if (txtHoraFinal.Text.Trim().Length > 0)
                    filter.setHoraFinal(txtHoraFinal.Text);

                int indiceDesistencia = 0;

                if (int.TryParse(txtIndiceDesistencia.Text, out indiceDesistencia)) {
                    filter.TempoAtendimento = indiceDesistencia;
                }
                else {
                    throw new ArgumentException("O Indice de Desistência deve ser numérico.");
                }

                PesquisarEventArgs args = new PesquisarEventArgs(filter);
                args.GerarGrafico = chkShowChart.Checked;
                //args.ExportarRelatorio = chkExportRelatorio.Checked;

                OnPesquisar(args);

            }
            catch (Exception ex) {
                cvlMensagem.IsValid = false;
                cvlMensagem.Text = ex.Message;
            }
        }


        private void CarregaAllRfsListBox()                                         {
            DAOFactory factory = DAOFactory.GetDAOFactory(DAOFactoryType.ORACLE);
            Rfs daoRfs = factory.GetRfsDAO();
            RfsCriteria criteria = new RfsCriteria();

            lstRFS.DataSource = daoRfs.ListarIdentificacao(criteria);
            lstRFS.DataTextField = "nome";
            lstRFS.DataValueField = "id";

            lstRFS.DataBind();
            lstRFS.Items.Insert(0, new ListItem("-- Todos --", "0", true));
        }


        private void CarregaAllRegiaoListBox()                                      {
            DAOFactory factory = DAOFactory.GetDAOFactory(DAOFactoryType.ORACLE);

            Regiao daoRegiao = factory.GetRegiaoDAO();
            RegiaoCriteria criteria = new RegiaoCriteria();

            if (lstRFS.SelectedIndex > 0)
                foreach (ListItem item in lstRFS.Items) {
                    if (item.Selected)
                        criteria.addRfs(Convert.ToInt32(item.Value));
                }

            lstRegiao.DataSource = daoRegiao.ListarIdentificacao(criteria);
            lstRegiao.DataTextField = "nome";
            lstRegiao.DataValueField = "id";

            lstRegiao.DataBind();
            lstRegiao.Items.Insert(0, new ListItem("-- Todos --", "0", true));
        }


        private void CarregaAllLojaListBox()                                        {
            DAOFactory factory = DAOFactory.GetDAOFactory(DAOFactoryType.ORACLE);

            Loja daoLoja = factory.GetLojaDAO();
            LojaCriteria criteria = new LojaCriteria();

            //RFS
            if (lstRFS.SelectedIndex > 0)
                foreach (ListItem item in lstRFS.Items) {
                    if (item.Selected)
                        criteria.addRfs(Convert.ToInt32(item.Value));
                }

            //REGIÃO
            if (lstRegiao.SelectedIndex > 0)
                foreach (ListItem item in lstRegiao.Items) {
                    if (item.Selected)
                        criteria.addRegiao(Convert.ToInt32(item.Value));
                }

            lstLoja.DataSource = daoLoja.ListarIdentificacao(criteria);
            lstLoja.DataTextField = "nome";
            lstLoja.DataValueField = "id";

            lstLoja.DataBind();
            lstLoja.Items.Insert(0, new ListItem("-- Todos --", "0", true));
        }
    }
}